package com.fileupload.process.strategy;

import com.fileupload.common.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * 基于相对路径的不同目录移动策略实现
 * 将文件移动到不同的目标目录，并保留原始相对路径结构
 */
public class DiffMovePathFileStrategy extends AbstractFileFinishActionStrategy {

    private static final Logger logger = LoggerFactory.getLogger(DiffMovePathFileStrategy.class);

    /**
     * 默认构造函数
     */
    public DiffMovePathFileStrategy() {
        super("diff-move-path");
    }
    
    /**
     * 构造函数
     * 
     * @param monitorDir 监控目录
     */
    public DiffMovePathFileStrategy(String monitorDir) {
        super("diff-move-path", monitorDir);
    }

    @Override
    public boolean execute(File file, String targetDir) {
        logger.debug("执行基于相对路径的不同目录移动操作: 文件={}, 目标目录={}", file.getAbsolutePath(), targetDir);
        
        if (file == null || !file.exists()) {
            logger.error("文件不存在: {}", file);
            return false;
        }
        
        if (targetDir == null || targetDir.trim().isEmpty()) {
            logger.error("目标目录不能为空");
            return false;
        }
        
        try {
            // 构建目标路径，保留相对路径结构
            String relativePath = getRelativePath(file, getMonitorDir());
            Path destinationPath;
            
            if (relativePath != null && !relativePath.isEmpty()) {
                // 移除文件名，保留路径结构
                int lastSlashIndex = relativePath.lastIndexOf('/');
                if (lastSlashIndex > 0) {
                    String pathStructure = relativePath.substring(0, lastSlashIndex);
                    destinationPath = Paths.get(targetDir, pathStructure);
                } else {
                    destinationPath = Paths.get(targetDir);
                }
            } else {
                destinationPath = Paths.get(targetDir);
            }
            
            // 确保目标目录存在
            FileUtils.ensureDirectoryExists(destinationPath);
            
            // 目标文件路径
            Path destination = destinationPath.resolve(file.getName());
            
            // 移动文件，添加REPLACE_EXISTING选项来覆盖已存在的文件
            Files.move(file.toPath(), destination, StandardCopyOption.REPLACE_EXISTING);
            logger.info("文件基于相对路径移动成功: 从={} 到={}", file.getAbsolutePath(), destination);
            return true;
        } catch (IOException e) {
            logger.error("基于相对路径移动文件失败: {}", e.getMessage(), e);
            return false;
        }
    }
}